package jm.nj.demo15mian.demo03;

import java.io.File;
import java.lang.reflect.Field;

/*
* 使用反射技术获取类中的成员变量(字段)
* 1.获取class文件对象
* 2.通过class对象中提供的方法获取字段
* 3.获取字段的值,设置字段的值
*
 * private String id;
 * private String name;
 * public int age;
 *
 * 暴力反射破坏了程序的封装性,不推荐使用
* */
public class Demo04Reflect {
    public static void main(String[] args) throws Exception {
        //1.获取class文件对象
        Class clazz = Class.forName("jm.nj.demo15mian.demo02.Person");
        /*
        * 2.通过 class 对象提供的方法获得类中的字段
        *
        * file[] getFields() 获取所有的公共字段
        * Field[] getDeclaredFields()  获取所有的字段,包含私有的
        * */
        Field[] fields = clazz.getFields();
        for (Field field : fields) {
            System.out.println(field);
        }

        System.out.println("==============");
        /*
        * Field getFeild(String name) 获取指定公共成员字段.
        * Field getDeclaredField(String name)获取指定成员字段,包含私有的
        * name 字段(成员变量)  的字符串格式名称
        *
        * */
        //private String id;
        Field fId= clazz.getDeclaredField("id");
        System.out.println(fId);

        //private String name
        Field fName= clazz.getDeclaredField("name");
        System.out.println(fName);

        //public int age;
        Field fAge = clazz.getField("age");
        System.out.println(fAge);

        /*
        * 3.获取字段值,设置字段值
        * Object get(Object obj)   返回指定对象上此Field 表示的字段值.
        * void set (Object obj, Object value)  将指定对象变量上此Field 对象表示的字段设置为指定的新值
        *
        * 方法的参数
        * Object:必须有对象支持,要获取/设置的是哪一个对象
        * value:给字段的值
        *
        *
        * */
        //快速获取被反射类的对象

        Object obj = clazz.newInstance();//类似构造
        //获取age的值
        Object objAge = fAge.get(obj);
        System.out.println("objAge:"+objAge);

        //获取私有字段值-->暴力反射
        fId.setAccessible(true);
        Object objId = fId.get(obj);
        System.out.println("objId:"+objId);

        fName.setAccessible(true);
        Object objName = fName.get(obj);
        System.out.println(objName);

        fAge.set(obj,20);
        fId.set(obj,"002");
        fName.set(obj,"李四");
        System.out.println(obj);
    }
}
